package com.zh.javaguide.atomic;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.IntUnaryOperator;

/**
 * Copyright (C) 广州中和互联网技术有限公司
 * Atomic原子类
 * @author 范家微 fanjiawei@borche.cn
 * @date :2021/1/23 20:33
 */
public class AtomicDemo {
	/**
	 *  Atomic 是指⼀个操作是不可中断的。
	 *  即使是在多个线程⼀起执⾏的时候，⼀个操作⼀旦开始，就不会被其他线程⼲扰。
	 *  原理：
	 *  AtomicInteger 类主要利⽤ CAS (compare and swap) + volatile 和 native ⽅法来保证原⼦操作，
	 * 从⽽避免 synchronized 的⾼开销，执⾏效率⼤为提升。
	 * CAS的原理是拿期望的值和原本的⼀个值作比较，如果相同则更新成新的值。UnSafe 类的
	 * objectFieldOffset() ⽅法是⼀个本地⽅法，这个⽅法是⽤来拿到“原来的值”的内存地址，返回值是
	 * valueOffset。另外 value 是⼀个volatile变量，在内存中可⻅，因此 JVM 可以保证任何时刻任何线
	 * 程总能拿到该变量的最新值。
	 *
	 *     // 更新操作时提供“比较并替换”的作⽤
	 *     private static final Unsafe unsafe = Unsafe.getUnsafe();
	 *     private static final long valueOffset;
	 *
	 *     static {
	 *         try {
	 *             valueOffset = unsafe.objectFieldOffset
	 *                 (AtomicInteger.class.getDeclaredField("value"));
	 *         } catch (Exception ex) { throw new Error(ex); }
	 *     }
	 *
	 *     private volatile int value;
	 */
	public static void main(String[] args) {
		AtomicInteger integer = new AtomicInteger();
		System.out.println(integer.get());
		System.out.println(integer.getAndAdd(1));
		System.out.println(integer.getAndIncrement());
		System.out.println(integer.getAndDecrement());
		System.out.println(integer.getAndSet(100));
		System.out.println(integer.getAndDecrement());
		System.out.println(integer.updateAndGet(IntUnaryOperator.identity()));
		System.out.println(integer.compareAndSet(99,1000));
		integer.lazySet(999_99999);
		System.out.println(integer);
	}
}
